home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / HELLSRC.ZIP / P3.ASM < prev    next >
Assembly Source File  |  1993-10-30  |  21KB  |  727 lines

  1.         .386p
  2. code32  segment para public use32
  3.         assume cs:code32, ds:code32
  4.  
  5. include pmode.inc
  6. include gsp669.inc
  7. include vect3.inc
  8. include kb.inc
  9. include v.inc
  10.  
  11. public  _p3
  12.  
  13. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  14. ; DATA
  15. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  16. align 4
  17. BALLSLEN        = 127000
  18.  
  19. MUZLOC0         = 0c00h
  20.  
  21. ballstblptr     dd      ?               ; ptrs to balls addx table
  22. ballsoldptr     dd      ?,?             ; erase areas buffer ptrs
  23. ballsvidptrcur  dd      ?               ; current video page ptr
  24. ballsoldptrcur  dd      ?               ; current erase areas buffer ptr
  25. ballsdestpalptr dd      ?               ; ptr to pal to slide to
  26.  
  27. fallbgptr       dd      ?               ; ptr to bg for falling pieces
  28. fallpicptr      dd      ?,?,?,?         ; ptrs to falling pics
  29. fallrout        dd      p3m0r4d,p3m0r4c,p3m0r4b,p3m0r4a
  30.  
  31. p3m0seqrout     dd      p3m0sr0         ; sequence routine for glass balls
  32. p3m0rout        dd      _ret,p3m0r2,p3m0r1
  33. p3m0r1rout      label   dword           ; entry points in ball raster put code
  34. irp temp,<16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0>
  35.                 dd      p3m0r1l0f0+&temp*P3M0R1LEN
  36. endm
  37. p3m0r2rout      label   dword           ; entry points in other ball put code
  38. irp temp,<16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0>
  39.                 dd      p3m0r2l0f0+&temp*P3M0R2LEN
  40. endm
  41.  
  42. ballsrot        dw      0,0,0
  43. ballscoords     dw      5, 0,80,0, 76,25,0, 47,-65,0, -47,-65,0, -76,25,0
  44. ballscoordsrot  dw      ?, 5*5 dup(?)
  45. ballsdata       dw      5*2 dup(?)
  46.  
  47. vrtcntr         db      0
  48. ovrtcntr        db      0
  49.  
  50. ballspageindex  db      1               ; glass balls page index
  51. ballspagetbl    db      0,40h           ; glass balls page offset table
  52. ballsoldnum     db      0,0             ; number of erase areas in buffer
  53. ballsnumcur     db      ?               ; current number of erase areas
  54. ballscoloradd   db      ?               ; add to color when drawing ball
  55. ballsputrout    db      5 dup(0)        ; routine to put ball
  56. ballscolor      db      5 dup(40h),?    ; table of colors to add for each ball
  57. ballsindex      db      5               ; index of ball being worked on
  58. ballszdelta     db      0               ; current Z offset delta
  59. ballsydelta     db      0               ; current Y offset delta
  60. ballsxdelta     db      0               ; current X offset delta
  61. ballsdeltawait  db      0               ; counter for delta change
  62.  
  63. fallindex       db      4               ; index of falling piece
  64. fallycntr       db      0               ; Y size of falling piece
  65. fallxcntr       db      ?               ; X size of falling piece
  66.  
  67. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  68. ; CODE
  69. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  70.  
  71. ;═════════════════════════════════════════════════════════════════════════════
  72. p3ir0:                                  ; only increment retrace timer
  73.         inc vrtcntr
  74.         ret
  75.  
  76. ;═════════════════════════════════════════════════════════════════════════════
  77. p3ir1:                                  ; set colors and slide
  78.         cld
  79.         push bx ecx esi edi
  80.         mov edi,_cpalptr
  81.         add edi,60h*3
  82.         mov esi,edi
  83.         mov dx,3c8h
  84.         @outb 60h
  85.         inc edx
  86.         mov ecx,40h*3
  87.         rep outsb
  88.         mov esi,ballsdestpalptr
  89.         mov ecx,40h*3
  90.         mov bl,1
  91.         call _slidebytes
  92.         jnc short p3ir1f0
  93.         mov _vrtrout,offset p3ir0
  94. p3ir1f0:
  95.         inc vrtcntr
  96.         pop edi esi ecx bx
  97.         ret
  98.  
  99. ;═════════════════════════════════════════════════════════════════════════════
  100. _p3:
  101.         mov eax,'p30d'                  ; load and allocate data
  102.         call _loaddata
  103.         mov ballstblptr,eax
  104.         add eax,BALLSLEN
  105.         mov _v0r0sincosptr,eax
  106. ;       add eax,1280
  107. ;       mov fallbgptr,eax
  108.  
  109.         mov eax,6*4*2+160*100*4 +64000
  110.         call _gethimem
  111.         mov ballsoldptr[0],eax
  112.         add eax,6*4
  113.         mov ballsoldptr[4],eax
  114.         add eax,6*4
  115.         mov fallpicptr[0],eax
  116.         add eax,160*100
  117.         mov fallpicptr[4],eax
  118.         add eax,160*100
  119.         mov fallpicptr[8],eax
  120.         add eax,160*100
  121.         mov fallpicptr[12],eax
  122.         add eax,160*100         ;
  123.         mov fallbgptr,eax       ;
  124.  
  125.         mov edi,eax             ;
  126.         mov ecx,16000           ;
  127.         xor eax,eax             ;
  128.         rep stosd               ;
  129.  
  130.         mov _v0r0perspective,100        ; set up rotation vars
  131.         mov _v0r0tx,60
  132.         mov _v0r0ty,20
  133.         mov _v0r0tz,160
  134.  
  135.         mov dx,3ceh                     ; get 4 pics for fall into screen
  136.         @outb 4
  137.         inc edx
  138.         mov edi,fallpicptr[0]
  139.         xor esi,esi
  140.         call p3i0r0
  141.         mov edi,fallpicptr[4]
  142.         mov esi,80*100+40
  143.         call p3i0r0
  144.         mov edi,fallpicptr[8]
  145.         mov esi,40
  146.         call p3i0r0
  147.         mov edi,fallpicptr[12]
  148.         mov esi,80*100
  149.         call p3i0r0
  150.  
  151.         mov edi,_vidptr2                ; copy page 0 to page 2
  152.         mov esi,_vidptr0
  153.         mov dx,3c5h
  154.         @outb 0fh
  155.         mov dl,0ceh
  156.         @outw 4105h
  157.         mov ecx,4000h
  158.         rep movsb
  159.  
  160.         mov edi,ballstblptr             ; set up ball addresses
  161.         mov ecx,63
  162.         mov ebx,edi
  163.         mov eax,edi
  164. p3i0l0:
  165.         mov eax,[edi]
  166.         add eax,ebx
  167.         stosd
  168.         loop p3i0l0
  169.  
  170.         mov edx,0a8000h                 ; set up selectors for zoom routine
  171.         mov ax,_sel[0]
  172.         call _setselector
  173.         @php edx,fallpicptr[0]
  174.         mov ax,_sel[2]
  175.         call _setselector
  176.  
  177.         mov _vrtrout,offset p3ir0       ; set retrace timer routine
  178.  
  179.         mov edi,_cpalptr                ; set up some colors
  180.         lea esi,[edi+20h*3]
  181.         add edi,0a0h*3
  182.         mov ecx,40h
  183. p3i0l1:
  184.         mov word ptr [edi],3f3fh
  185.         mov byte ptr [edi+2],0
  186.         add edi,3
  187.         loop p3i0l1
  188.         mov ecx,40h
  189.         mov al,60h
  190.         mov ah,vrtcntr
  191. waitl1:
  192.         cmp ah,vrtcntr
  193.         je waitl1
  194.         call _setcpal
  195.  
  196.         mov dx,3ceh
  197.         @outw 4005h
  198.  
  199. ;═════════════════════════════════════════════════════════════════════════════
  200. ; Refracting glass balls
  201. p3m0:
  202.         movzx ebx,ballspageindex        ; set up some ptrs
  203.         mov eax,_vidptr0[ebx*4]
  204.         mov ballsvidptrcur,eax
  205.         mov eax,ballsoldptr[ebx*4]
  206.         mov ballsoldptrcur,eax
  207.         mov ballsnumcur,0
  208.  
  209.         movzx ebp,fallindex             ; put falling pieces
  210.         cmp ebp,3
  211.         ja p3m0f2
  212.         movzx ebx,fallycntr
  213.         dec bl
  214.         mov fallycntr,bl
  215.         imul eax,ebx,160
  216.         mov ecx,100
  217.         cdq
  218.         idiv ecx
  219.         mov fallxcntr,al
  220.         call fallrout[ebp*4]
  221.         movzx ecx,ballspageindex
  222.         movzx edx,ballsoldnum[ecx]
  223.         inc ballsoldnum[ecx]
  224.         lea edx,[edx*4]
  225.         add edx,ballsoldptr[ecx*4]
  226.         mov [edx],ebx
  227.         push eax
  228.  
  229.         mov dx,3c5h
  230.         push esi
  231.         push edi
  232.         call p3m0r3
  233.         pop edi
  234.         inc edi
  235.         call p3m0r3
  236.         pop esi
  237.         mov edi,esi
  238.         add esi,fallbgptr
  239.         add edi,_vidptr2
  240.         mov al,11h
  241. p3m0l5:
  242.         out dx,al
  243.         mov ecx,40
  244.         rep movsb
  245.         sub edi,40
  246.         add esi,80*200-40
  247.         rol al,1
  248.         jnc p3m0l5
  249.  
  250.         pop eax
  251.         movzx ecx,fallycntr
  252.         jecxz p3m0f2
  253.         shl ecx,16
  254.         mov cl,fallxcntr
  255.         mov ebx,6400a0h
  256.         movzx esi,fallindex
  257.         imul esi,160*100
  258.         xor edi,edi
  259.         mov es,_sel[0]
  260.         mov ds,_sel[2]
  261.         call _psbm
  262.         mov ax,cs:_seldata
  263.         mov es,ax
  264.         mov ds,ax
  265. p3m0f2:
  266.  
  267.         mov ebp,ballsvidptrcur          ; erase old balls
  268.         mov dx,3c5h
  269.         @outb 0fh
  270.         mov dl,0ceh
  271.         @outw 4105h
  272.         mov edx,ballsoldptrcur
  273.         movzx ebx,ballspageindex
  274.         mov bl,ballsoldnum[ebx]
  275.         call p3m0r0
  276. p3m0f0:
  277.  
  278.         movsx eax,ballszdelta           ; move balls on Z, Y, and X
  279.         add _v0r0tz,ax
  280.         movsx ebx,ballsydelta
  281.         add _v0r0ty,bx
  282.         movsx ecx,ballsxdelta
  283.         add _v0r0tx,cx
  284.         mov dl,ballsdeltawait
  285.         inc dl
  286.         and dl,7
  287.         mov ballsdeltawait,dl
  288.         jnz short p3m0f1
  289.         cmp _v0r0tz,190
  290.         setl dl
  291.         shl dl,1
  292.         sub dl,1
  293.         add al,dl
  294.         cmp _v0r0ty,0
  295.         setl dl
  296.         shl dl,1
  297.         sub dl,1
  298.         add bl,dl
  299.         cmp _v0r0tx,0
  300.         setl dl
  301.         shl dl,1
  302.         sub dl,1
  303.         add cl,dl
  304.         mov ballszdelta,al
  305.         mov ballsydelta,bl
  306.         mov ballsxdelta,cl
  307. p3m0f1:
  308.  
  309.         movzx ebx,ballsrot[0]           ; rotate glass balls
  310.         add ebx,1
  311.         and bx,1ffh
  312.         mov ballsrot[0],bx
  313.         movzx ecx,ballsrot[2]
  314.         add ecx,2
  315.         and cx,1ffh
  316.         mov ballsrot[2],cx
  317.         movzx edx,ballsrot[4]
  318.         add edx,4
  319.         and dx,1ffh
  320.         mov ballsrot[4],dx
  321.         call _v0rot0init
  322.         mov edi,offset ballscoordsrot
  323.         mov esi,offset ballscoords
  324.         call _v0rot0b
  325.  
  326.         mov edi,ballstblptr             ; set up balls for put
  327.         mov esi,offset ballscoordsrot+2
  328.         mov ebx,4
  329. p3m0l2:
  330.         movzx eax,word ptr [esi+4]
  331.         sub eax,75
  332.         shr eax,2
  333.         cmp eax,63
  334.         jb short p3m0l2f0
  335.         mov byte ptr ballsdata[ebp*4+1],255
  336.         jmp short p3m0l2c
  337. p3m0l2f0:
  338.         mov byte ptr ballsdata[ebx*4+1],al
  339.         mov ebp,[edi+eax*4]
  340.         movzx edx,byte ptr [ebp+1]
  341.         movzx ecx,byte ptr [ebp]
  342.         shr edx,1
  343.         shr ecx,1
  344.         movsx eax,word ptr [esi+8]
  345.         add eax,100
  346.         sub eax,edx
  347.         imul eax,320
  348.         movsx ebp,word ptr [esi+6]
  349.         sub ebp,ecx
  350.         lea eax,[eax+ebp+160]
  351.         mov word ptr ballsdata[ebx*4+2],ax
  352.         mov byte ptr ballsdata[ebx*4],bl
  353. p3m0l2c:
  354.         add esi,10
  355.         sub bl,1
  356.         jnc p3m0l2
  357.  
  358.         mov ebp,1                       ; sort balls by depth
  359.         mov edx,offset ballsdata+3*4
  360. p3m0l3:
  361.         mov edi,edx
  362.         lea esi,[edi+4]
  363.         mov ecx,ebp
  364.         mov eax,[edi]
  365. p3m0l3l0:
  366.         cmp ah,[edi+ecx*4+1]
  367.         ja short p3m0l3l0d
  368.         dec ecx
  369.         jnz p3m0l3l0
  370. p3m0l3l0d:
  371.         rep movsd
  372.         mov [edi],eax
  373.         sub edx,4
  374.         inc ebp
  375.         cmp ebp,5
  376.         jb p3m0l3
  377.  
  378.         mov esi,4                       ; put glass balls to screen
  379.         mov dx,3ceh
  380.         @outw 4005h
  381.         @outb 4
  382. p3m0l1:
  383.         movzx ebp,byte ptr ballsdata[esi*4+1]
  384.         cmp ebp,62
  385.         ja p3m0l1c
  386.  
  387.         push esi
  388.         lea ebp,[ebp*4]
  389.         add ebp,ballstblptr
  390.         mov ebp,[ebp]
  391.         movzx ecx,byte ptr ballsdata[esi*4]
  392.         mov al,ballscolor[ecx]
  393.         mov ballscoloradd,al
  394.  
  395.         movzx edx,byte ptr [ebp]
  396.         dec edx
  397.         shl edx,16
  398.         movzx ebx,word ptr ballsdata[esi*4+2]
  399.         mov edi,ebx
  400.         shr edi,2
  401.         movzx eax,byte ptr ballsputrout[ecx]
  402.         push edi ebp
  403.         add ebp,2
  404.         call p3m0rout[eax*4]
  405.         pop ebp edi
  406.  
  407.         mov bx,[ebp]
  408.         shr bh,2
  409.         add bh,2
  410.         movzx ecx,ballsnumcur
  411.         mov eax,ballsoldptrcur
  412.         mov [eax+ecx*4],di
  413.         mov [eax+ecx*4+2],bx
  414.         inc ecx
  415.         mov ballsnumcur,cl
  416.  
  417.         pop esi
  418. p3m0l1c:
  419.         sub esi,1
  420.         jnc p3m0l1
  421.  
  422.         mov dx,3d5h                     ; set new page
  423.         movzx ebx,ballspageindex
  424.         mov al,ballsnumcur
  425.         mov ballsoldnum[ebx],al
  426.         @outb ballspagetbl[ebx]
  427.         xor bl,1
  428.         mov ballspageindex,bl
  429.  
  430.         mov al,vrtcntr                  ; wait for a vertical retrace
  431. waitl0:
  432.         cmp al,vrtcntr
  433.         je waitl0
  434.  
  435.         jmp p3m0seqrout                 ; jump to appropriate sequence routine
  436.  
  437. ;─────────────────────────────────────────────────────────────────────────────
  438. p3m0sr0:                                ; wait for slide to normal to end
  439.         cmp _vrtrout,offset p3ir0
  440.         jne p3m0
  441.         movzx eax,ballsindex
  442.         mov ballscolor[eax],0
  443.         sub al,1
  444.         jc p3m0sr0f0
  445.         mov byte ptr ballsputrout[eax],1
  446.         mov ballsindex,al
  447.         mov p3m0seqrout,offset p3m0sr1
  448.         jmp p3m0
  449. p3m0sr0f0:
  450.         mov p3m0seqrout,offset p3m0sr4
  451.         jmp p3m0
  452. ;-----------------------------------------------------------------------------
  453. p3m0sr1:                                ; set slide to single color
  454.         mov eax,_cpalptr
  455.         add eax,0a0h*3
  456.         mov ballsdestpalptr,eax
  457.         mov _vrtrout,offset p3ir1
  458.         mov p3m0seqrout,offset p3m0sr2
  459.         jmp p3m0
  460. ;-----------------------------------------------------------------------------
  461. p3m0sr2:                                ; wait for end slide to single color
  462.         cmp _vrtrout,offset p3ir0
  463.         jne p3m0
  464.         movzx eax,ballsindex
  465.         mov byte ptr ballsputrout[eax],2
  466.         mov p3m0seqrout,offset p3m0sr3
  467. ;-----------------------------------------------------------------------------
  468. p3m0sr3:                                ; set slide to normal color
  469.         mov eax,_cpalptr
  470.         add eax,20h*3
  471.         mov ballsdestpalptr,eax
  472.         mov _vrtrout,offset p3ir1
  473.         mov p3m0seqrout,offset p3m0sr0
  474.         jmp p3m0
  475. ;-----------------------------------------------------------------------------
  476. p3m0sr4:                                ; wait for muzik meta point
  477.         cmp _muzloc,MUZLOC0
  478.         jb p3m0
  479.     mov p3m0seqrout,offset p3m0sr5
  480.         jmp p3m0
  481. ;-----------------------------------------------------------------------------
  482. p3m0sr5:                ; wait for fall to end
  483.         mov al,fallycntr
  484.         or al,al
  485.         jnz p3m0
  486.         inc al
  487.         mov fallycntr,al
  488.         mov p3m0seqrout,offset p3m0sr6
  489.         jmp p3m0
  490. ;-----------------------------------------------------------------------------
  491. p3m0sr6:                ; set next fall (if any)
  492.     mov al,fallindex
  493.         sub al,1
  494.     jc p3m0sr6f0
  495.         mov fallindex,al
  496.         mov fallycntr,100
  497.         mov p3m0seqrout,offset p3m0sr5
  498.     jmp p3m0
  499. p3m0sr6f0:
  500.         mov fallindex,0ffh
  501.         mov p3m0seqrout,offset p3m0sr7
  502.         jmp p3m0
  503. ;-----------------------------------------------------------------------------
  504. p3m0sr7:                                ; end of this part
  505.         mov dx,3d5h                     ; set page 2
  506.         @outb 80h
  507.  
  508.         mov eax,_ohimembase             ; clean up high memory base ptr
  509.         mov _himembase,eax
  510.         mov _vrtrout,offset _ret        ; clear retrace routine
  511.  
  512.         ret
  513.  
  514. ;─────────────────────────────────────────────────────────────────────────────
  515. p3i0r0:                                 ; get a 160x100 bitmap from screen
  516.         add esi,_vidptr0
  517.         xor al,al
  518. p3i0r0l0:
  519.         out dx,al
  520.         mov ch,100
  521. p3i0r0l0l0:
  522.         mov cl,40
  523. p3i0r0l0l0l0:
  524.         movsb
  525.         add edi,3
  526.         dec cl
  527.         jnz p3i0r0l0l0l0
  528.         add esi,40
  529.         dec ch
  530.         jnz p3i0r0l0l0
  531.         sub edi,160*100-1
  532.         sub esi,80*100
  533.         inc al
  534.         and al,3
  535.         jnz p3i0r0l0
  536.         ret
  537.  
  538. ;─────────────────────────────────────────────────────────────────────────────
  539. p3m0r0:                                 ; copy into erase areas
  540.         or bl,bl
  541.         jz _ret
  542.         xor ecx,ecx
  543.         xor eax,eax
  544. p3m0r0l0:
  545.         movzx esi,word ptr [edx]
  546.         lea edi,[ebp+esi]
  547.         add esi,_vidptr2
  548.         mov bh,[edx+3]
  549.         mov al,80
  550.         sub al,bh
  551.         push word ptr [edx+2]
  552. p3m0r0l0l0:
  553.         mov cl,bh
  554.         rep movsb
  555.         add edi,eax
  556.         add esi,eax
  557.         dec byte ptr [esp]
  558.         jnz p3m0r0l0l0
  559.         add esp,2
  560.         add edx,4
  561.         dec bl
  562.         jnz p3m0r0l0
  563.         ret
  564.  
  565. ;─────────────────────────────────────────────────────────────────────────────
  566. p3m0r1:                                 ; put glass ball to screen
  567.         add edi,ballsvidptrcur
  568.         mov dx,3c5h
  569.         movzx eax,bl
  570.         and al,3
  571.         mov al,_vidbitloc2[eax]
  572.         mov ah,4
  573.         mov ecx,_vidptr2
  574.         lea esi,[ecx*4+ebx]
  575. p3m0r1l0:
  576.         out dx,al
  577.         push eax edx edi
  578.         mov dx,3cfh
  579.         mov ah,ballscoloradd
  580. p3m0r1l0l0:
  581.         movsx ecx,byte ptr [ebp]
  582.         sub edi,ecx
  583.         movzx ebx,byte ptr [ebp+1]
  584.         jmp p3m0r1rout[ebx*4]
  585. p3m0r1l0f0:
  586. irp temp,<15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0>
  587. temp2=$
  588.         movzx ebx,word ptr [ebp+&temp*2+2]
  589.         add ebx,esi
  590.         mov al,bl
  591.         and al,3
  592.         out dx,al
  593.         shr ebx,2
  594.         mov al,[ebx]
  595.         add al,ah
  596.         db 88h,47h,&temp        ; mov [edi+&temp],al
  597. P3M0R1LEN=$-temp2
  598. endm
  599.         movzx ebx,byte ptr [ebp+1]
  600.         lea ebp,[ebp+ebx*2+2]
  601.         lea edi,[edi+ecx+80]
  602.         sub edx,10000h
  603.         jnc p3m0r1l0l0
  604.         pop edi edx eax
  605.         rol al,1
  606.         adc edi,0
  607.         dec ah
  608.         jnz p3m0r1l0
  609.         ret
  610.  
  611. ;─────────────────────────────────────────────────────────────────────────────
  612. p3m0r2:                                 ; put ball with no refraction
  613.         add edi,ballsvidptrcur
  614.         mov dh,3
  615.         and ebx,3
  616.         mov ah,4
  617. p3m0r2l0:
  618.         mov dl,0cfh
  619.         @outb bl
  620.         mov dl,0c5h
  621.         @outb _vidbitloc[ebx]
  622.         push edx edi
  623. p3m0r2l0l0:
  624.         movsx ecx,byte ptr [ebp]
  625.         sub edi,ecx
  626.         movzx esi,byte ptr [ebp+1]
  627.         jmp p3m0r2rout[esi*4]
  628. p3m0r2l0f0:
  629. irp temp,<15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0>
  630. temp2=$
  631.         db 80h,47h,&temp,40h    ; add byte ptr [edi+&temp],40h
  632. P3M0R2LEN=$-temp2
  633. endm
  634.         lea ebp,[ebp+esi*2+2]
  635.         lea edi,[edi+ecx+80]
  636.         sub edx,10000h
  637.         jnc p3m0r2l0l0
  638.         pop edi edx
  639.         inc bl
  640.         and bl,3
  641.         jnz short $+3
  642.         inc edi
  643.         dec ah
  644.         jnz p3m0r2l0
  645.         ret
  646.  
  647. ;─────────────────────────────────────────────────────────────────────────────
  648. p3m0r3:                                 ; copy vertical line of BG pic
  649.         mov ebx,edi
  650.         and ebx,3
  651.         @outb _vidbitloc[ebx]
  652.         shr edi,2
  653.         mov esi,edi
  654.         add edi,_vidptr2
  655.         imul ebx,80*200
  656.         add esi,ebx
  657.         add esi,fallbgptr
  658.         mov ah,10
  659. p3m0r3l0:
  660. irp temp,<0,1,2,3,4,5,6,7,8,9>
  661.         mov al,[esi+&temp*80]
  662.         mov [edi+&temp*80],al
  663. endm
  664.         add edi,80*10
  665.         add esi,80*10
  666.         dec ah
  667.         jnz p3m0r3l0
  668.         ret
  669.  
  670. ;─────────────────────────────────────────────────────────────────────────────
  671. p3m0r4a:                                ; fall position for lower left part
  672.         mov ebx,28641f40h
  673.         mov eax,6400a0h
  674.         sub al,fallxcntr
  675.         movzx esi,fallycntr
  676.         lea esi,[esi*4+esi]
  677.         lea esi,[esi*4]
  678.         lea esi,[esi*4+80*100]
  679.         movzx edi,al
  680.         add edi,320*100-2
  681.         ret
  682. ;-----------------------------------------------------------------------------
  683. p3m0r4b:                                ; fall position for upper right part
  684.         mov ebx,28640028h
  685.         mov eax,100
  686.         sub al,fallycntr
  687.         movzx esi,al
  688.         shl eax,16
  689.         mov al,0a0h
  690.         lea esi,[esi*4+esi-5]
  691.         lea esi,[esi*4]
  692.         lea esi,[esi*4+40]
  693.         movzx edi,fallxcntr
  694.         add edi,160
  695.         ret
  696. ;-----------------------------------------------------------------------------
  697. p3m0r4c:                                ; fall position for lower right part
  698.         mov ebx,28641f68h
  699.         mov eax,6400a0h
  700.         movzx esi,fallycntr
  701.         lea esi,[esi*4+esi]
  702.         lea esi,[esi*4]
  703.         lea esi,[esi*4+80*100+40]
  704.         movzx edi,fallxcntr
  705.         add edi,160+320*100
  706.         ret
  707. ;-----------------------------------------------------------------------------
  708. p3m0r4d:                                ; fall position for upper left part
  709.         mov ebx,28640000h
  710.         mov eax,100
  711.         sub al,fallycntr
  712.         movzx esi,al
  713.         shl eax,16
  714.         mov al,160
  715.         sub al,fallxcntr
  716.         lea esi,[esi*4+esi-5]
  717.         lea esi,[esi*4]
  718.         lea esi,[esi*4]
  719.         movzx edi,al
  720.         sub edi,2
  721.         ret
  722.  
  723.  
  724. code32  ends
  725.         end
  726.  
  727.